home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / net / bind-contrib.tar.gz / bind-contrib.tar / contrib / misc / ndrev.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-25  |  4.7 KB  |  221 lines

  1. #if 0
  2. Date:     Mon, 26 Apr 1993 18:03:06 -0400
  3. From: Andy Poling <andy@jhunix.hcf.jhu.edu>
  4. Subject: Re: send me your tools 
  5. To: Paul A Vixie <vixie>
  6. In-Reply-To: <9304261923.AA15488@cognition.pa.dec.com>
  7. Message-Id: <Pine.3.05.9304261804.B1586-d100000@jhunix2.hcf.jhu.edu>
  8. Mime-Version: 1.0
  9. Content-Type: TEXT/PLAIN; charset=US-ASCII
  10.  
  11. On Mon, 26 Apr 1993, Paul A Vixie wrote:
  12. > more is better.  send it along.
  13.  
  14. Here is the source (the date will give you an idea of its age), which
  15. luckily contains the original author's name (though I apparently lost his
  16. address long ago). 
  17.  
  18. -Andy
  19.  
  20. Andy Poling                              Internet: andy@jhunix.hcf.jhu.edu
  21. UNIX Systems Programmer                  Bitnet: ANDY@JHUNIX
  22. Homewood Academic Computing              Voice: (410)516-8096    
  23. Johns Hopkins University                 UUCP: uunet!mimsy!aplcen!jhunix!andy
  24.  
  25. ===============================================================================
  26. #endif /*0*/
  27.  
  28. /*
  29.  *    Ndrev    Takes a standard "NAMED" file and creates "reverse" (PTR)
  30.  *        entries from each host (IN A) entry.
  31.  *
  32.  *    Calling sequence:
  33.  *
  34.  *        ndrev NETWORK -d DOMAIN [FILE]
  35.  *
  36.  *    where:    NETWORK    is the class a, b, or c network or subnetwork
  37.  *            number to reverse.  All entries not belonging
  38.  *            to this network will be ignored.
  39.  *
  40.  *        DOMAIN    is the root domain of the NAMED file being processed.
  41.  *
  42.  *        FILE    is the source file name.  Default is standard input.
  43.  *
  44.  *    Written by Douglas E. Nelson, Michigan State University
  45.  *
  46.  *    Copyright, 1989, Michigan State University Board of Trustees
  47.  */
  48.  
  49. #include <stdio.h>
  50. #include <sys/types.h>
  51. #include <sys/stat.h>
  52.  
  53. gotoeol(f) 
  54. register FILE *f; 
  55.   register char ch; 
  56.   do
  57.     ch=getc(f);
  58.   while(ch!='\n' && ch!=EOF); 
  59.   if (ch==EOF) 
  60.     return(EOF);
  61.   else 
  62.     return(0); 
  63.  
  64. /* subroutine:  no case string compare(str1,str2) 
  65. * compares two strings ignoring alphabetic case 
  66. * returns NULL if they are equal 
  67. */ 
  68. int 
  69. ncstrcmp(str1,str2) 
  70. register unsigned char *str1,*str2; 
  71.   register unsigned char ch1,ch2; 
  72.   if (str1==str2) return(0); 
  73.   if (str1==NULL || str2==NULL) return(1); 
  74.   while (*str1!=NULL && *str2!=NULL) 
  75.   {
  76.     ch1= *str1>='A'&&*str1<='Z'?*str1++|32:*str1++; 
  77.     ch2= *str2>='A'&&*str2<='Z'?*str2++|32:*str2++; 
  78.     if (ch1!=ch2) return(1); 
  79.   } 
  80.   if (*str1!=NULL || *str2!=NULL) 
  81.     return(-1); 
  82.   return(0); 
  83.  
  84.  
  85. main(argc,argv) 
  86. int argc; 
  87. char *argv[];
  88.   FILE *f; 
  89.   char ch; 
  90.   int i,hwmany; 
  91.   char name[80],instr[80],instr2[80],adrs[80],deptname[80]; 
  92.   int a1, a2, a3, a4;
  93.   int nadr, adr1, adr2, adr3, adr4;
  94.  
  95.   deptname[0]='\0';
  96.  
  97.   f = stdin;
  98.   while (--argc)  
  99.   {
  100.     ++argv;
  101.     if (**argv >= '0' && **argv <= '9')
  102.     {
  103.       nadr = sscanf (*argv,"%d.%d.%d.%d",&adr1,&adr2,&adr3,&adr4);
  104.       if (!nadr)
  105.       {
  106.     fprintf (stderr, "Unknown argument: %s\n",*argv);
  107.     exit (-1);
  108.       }
  109.       if (nadr > 3)
  110.       {
  111.     fprintf (stderr, "Cannot reverse a single host\n");
  112.     exit (-1);
  113.       }
  114.     }
  115.     else if (strcmp(*argv,"-d") == 0)
  116.     {
  117.       if (--argc < 1)
  118.       {
  119.     fprintf (stderr, "Domain name argument missing for -d\n");
  120.     exit (-1);
  121.       }
  122.       strcpy (deptname, *++argv);
  123.       strcat (deptname, ".");
  124.     }
  125.     else
  126.     {
  127.       f=fopen(*argv,"r"); 
  128.       if (f==0)
  129.       {
  130.     fprintf (stderr, "Unable to open file: %s\n",*argv);
  131.     exit (-2);
  132.       }
  133.     }
  134.   }
  135.  
  136.   if (!nadr)
  137.   {
  138.     fprintf (stderr, "Must specify the (sub)network to reverse, e.g. 35.8\n");
  139.     exit (-1);
  140.   }
  141.  
  142.   fprintf (stdout, "$ORIGIN\t");
  143.   if (nadr > 2)  
  144.     fprintf (stdout, "%d.",adr3);
  145.   if (nadr > 1)  
  146.     fprintf (stdout, "%d.",adr2);
  147.   fprintf (stdout, "%d.IN-ADDR.ARPA.\n",adr1);
  148.  
  149.   do
  150.   { 
  151.     do 
  152.     ch=getc(f); 
  153.     while (ch=='\n' && ch!=EOF); 
  154.     if (ch<'A' || ch>'z' || ch>'Z' && ch<'a')
  155.     {
  156.       switch (ch)
  157.       {
  158.     case '$':
  159.     {
  160.       fscanf(f,"%s %s",name,instr);
  161.       ch=gotoeol(f);
  162.       if (ncstrcmp("ORIGIN",name)==NULL)
  163.       {
  164.         strcpy(deptname,instr);
  165.       }
  166.       break;
  167.     }
  168. /*
  169.     case ';':
  170.     {
  171.       putc(ch,stdout);
  172.       while (ch!='\n' && ch!=EOF)
  173.       {
  174.         ch=getc(f);
  175.         putc(ch,stdout);
  176.       }
  177.       break;
  178.     }
  179. */
  180.     default:
  181.     {
  182.       ch=gotoeol(f);
  183.       break;
  184.     }
  185.       }
  186.     }
  187.     else
  188.     { 
  189.       ungetc(ch,f); 
  190.       hwmany=fscanf(f,"%s %s %s %s",name,instr,instr2,adrs); 
  191.       if (hwmany>=4 && ((ncstrcmp("IN",instr)==NULL) && (ncstrcmp("A",instr2)==NULL)))
  192.       {
  193.     sscanf (adrs,"%d.%d.%d.%d",&a1,&a2,&a3,&a4);
  194.     if (a1 == adr1 && (nadr < 2 || a2 == adr2) &&
  195.         (nadr < 3 || a3 == adr3))
  196.         {
  197.       fprintf(stdout,"%d",a4);
  198.       if (nadr < 3)
  199.         fprintf(stdout,".%d",a3);
  200.       if (nadr < 2)
  201.         fprintf(stdout,".%d",a2);
  202.       fprintf(stdout,"\tIN\tPTR\t");
  203.       fprintf(stdout,"%s",name);
  204.       if (strlen(deptname)>0 && name[strlen(name)-1] != '.')
  205.         fprintf(stdout,".%s",deptname);
  206.       putc('\n',stdout);
  207.     }
  208.       }
  209.     }
  210.   }
  211.   while (ch!=EOF); 
  212.   fclose(f);
  213.   return(0); 
  214.  
  215.